﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using TinyBug.Models;

namespace TinyBug.Controllers
{
	public class AccountController : Controller
	{

		//
		// GET: /Account/LogOn

		public ActionResult LogOn()
		{
			return View();
		}

		//
		// POST: /Account/LogOn

		[HttpPost]
		public ActionResult LogOn(LogOnModel model, string returnUrl)
		{
			if (ModelState.IsValid)
			{
				if (Membership.ValidateUser(model.UserName, model.Password))
				{
					FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
					if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
						&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
					{
						return Redirect(returnUrl);
					}
					else
					{
						return RedirectToAction("Index", "Home");
					}
				}
				else
				{
					ModelState.AddModelError("", "El nombre de usuario o la contraseña especificados son incorrectos.");
				}
			}

			// Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
			return View(model);
		}

		//
		// GET: /Account/LogOff

		public ActionResult LogOff()
		{
			FormsAuthentication.SignOut();

			return RedirectToAction("Index", "Home");
		}

		//
		// GET: /Account/Register

		public ActionResult Register()
		{
			return View();
		}

		//
		// POST: /Account/Register

		[HttpPost]
		public ActionResult Register(RegisterModel model)
		{
			if (ModelState.IsValid)
			{
				// Intento de registrar al usuario
				MembershipCreateStatus createStatus;
				Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

				if (createStatus == MembershipCreateStatus.Success)
				{
					FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
					return RedirectToAction("Index", "Home");
				}
				else
				{
					ModelState.AddModelError("", ErrorCodeToString(createStatus));
				}
			}

			// Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
			return View(model);
		}

		//
		// GET: /Account/ChangePassword

		[Authorize]
		public ActionResult ChangePassword()
		{
			return View();
		}

		//
		// POST: /Account/ChangePassword

		[Authorize]
		[HttpPost]
		public ActionResult ChangePassword(ChangePasswordModel model)
		{
			if (ModelState.IsValid)
			{

				// ChangePassword iniciará una excepción en lugar de
				// devolver false en determinados escenarios de error.
				bool changePasswordSucceeded;
				try
				{
					MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
					changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
				}
				catch (Exception)
				{
					changePasswordSucceeded = false;
				}

				if (changePasswordSucceeded)
				{
					return RedirectToAction("ChangePasswordSuccess");
				}
				else
				{
					ModelState.AddModelError("", "La contraseña actual es incorrecta o la nueva contraseña no es válida.");
				}
			}

			// Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
			return View(model);
		}

		//
		// GET: /Account/ChangePasswordSuccess

		public ActionResult ChangePasswordSuccess()
		{
			return View();
		}

		#region Status Codes
		private static string ErrorCodeToString(MembershipCreateStatus createStatus)
		{
			// Vaya a http://go.microsoft.com/fwlink/?LinkID=177550 para
			// obtener una lista completa de códigos de estado.
			switch (createStatus)
			{
				case MembershipCreateStatus.DuplicateUserName:
					return "El nombre de usuario ya existe. Escriba un nombre de usuario diferente.";

				case MembershipCreateStatus.DuplicateEmail:
					return "Ya existe un nombre de usuario para esa dirección de correo electrónico. Escriba una dirección de correo electrónico diferente.";

				case MembershipCreateStatus.InvalidPassword:
					return "La contraseña especificada no es válida. Escriba un valor de contraseña válido.";

				case MembershipCreateStatus.InvalidEmail:
					return "La dirección de correo electrónico especificada no es válida. Compruebe el valor e inténtelo de nuevo.";

				case MembershipCreateStatus.InvalidAnswer:
					return "La respuesta de recuperación de la contraseña especificada no es válida. Compruebe el valor e inténtelo de nuevo.";

				case MembershipCreateStatus.InvalidQuestion:
					return "La pregunta de recuperación de la contraseña especificada no es válida. Compruebe el valor e inténtelo de nuevo.";

				case MembershipCreateStatus.InvalidUserName:
					return "El nombre de usuario especificado no es válido. Compruebe el valor e inténtelo de nuevo.";

				case MembershipCreateStatus.ProviderError:
					return "El proveedor de autenticación devolvió un error. Compruebe los datos especificados e inténtelo de nuevo. Si el problema continúa, póngase en contacto con el administrador del sistema.";

				case MembershipCreateStatus.UserRejected:
					return "La solicitud de creación de usuario se ha cancelado. Compruebe los datos especificados e inténtelo de nuevo. Si el problema continúa, póngase en contacto con el administrador del sistema.";

				default:
					return "Error desconocido. Compruebe los datos especificados e inténtelo de nuevo. Si el problema continúa, póngase en contacto con el administrador del sistema.";
			}
		}
		#endregion
	}
}
